#!/usr/bin/python
# -*- coding:utf-8 -*-
# @author  : micah
# @time    :  
# @function: 
# @version :


import asyncio

# async def func():
#     print(1)
#     await asyncio.sleep(1)
#     return '这是一个返回值'
#
#
# async def main():
#     # 创建future对象
#     future_1 = asyncio.ensure_future(func())
#     future_2 = asyncio.ensure_future(func())
#
#     res_1 = await future_1
#     res_2 = await future_2
#
#     print(res_1, res_2)
#
#
# asyncio.run(main())

"""
ensure_future方法与之前使用的create_task极其类似
    ensure_future创建出来的对象不是task对象，而是future对象
    create_task创建出来的对象是task对象
    
    task对象其实是future对象的一个子类
"""

"""
以下代码因为任务没有返回值所以会导致当前程序卡死
"""

# async def main():
#     # 获取一个事件循环
#     loop = asyncio.get_event_loop()
#
#     # 创建一个任务，当前这个任务是一个future任务
#     fut = loop.create_future()
#
#     # 等待当前future任务的返回值
#     await fut
#
#
# asyncio.run(main())


"""
解决程序卡死问题
"""


async def set_return(fut):
    await asyncio.sleep(2)

    # 使用future对象中的set_result可以自己手动设置返回值
    fut.set_result('这是我们自己手动设置耳朵一个返回值..')


async def main():
    loop = asyncio.get_event_loop()  # 不是创建，如果当前代码有事件循环直接获取，如果没有则创建
    fut = loop.create_future()

    # 将当前set_return打包成一个task
    await loop.create_task(set_return(fut))

    # 拿到设置的返回值
    res = await fut

    # 打印
    print(res)


asyncio.run(main())
